function var int: mod_inverse(var int: a, var int: N) =
let {
var 1..ub(N)-1: result;
constraint (a * result) mod N = 1 /\
result <= N - 1 /\
result >= 1;
} in result;
constraint forall([n_inv[j] = mod_inverse(n[j],N) | j in 2..k]);
in binary '=' operator expression
in call 'mod_inverse'
in let expression
in variable declaration for 'result'
in binary '..' operator expression
constraint forall([n[j]*n_inv[j]+N*y[j]=1 | j in 2..k]);
constraint forall([n_inv[j]>=1 | j in 2..k]);
constraint forall([n_inv[j]<=N-1 | j in 2..k]);
albeit at the expense of having to declare a variable array y (that I don't actually use).